import requests
import json


class DeepSeekAI:
    def __init__(self, api_key=None):
        self.api_key = api_key or "sk-ff21e57e70bc4b31909fc3d7c70e32ea"  # 建议从环境变量读取
        self.api_url = "https://api.deepseek.com/v1/chat/completions"
        self.headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json",
        }

        # 修改后的因子挖掘提示词（避免花括号冲突）
        self.factor_mine_prompt = """你是一名专业金融分析师，请严格按以下规则执行：
        1. 从文本中提取直接影响资产价格的TOP3关键因子
        2. 对每个因子标注：
        - 影响方向：+1（正面）/ -1（负面）
        - 影响强度：1（弱）-3（强）
        - 影响的资产类别（股票/债券/商品等）
        3. 输出JSON格式，包含：
        - "factors": 因子列表
        - "summary": 对文本的总体多空判断

        输出示例：
        {{
        "factors": [
          {{
              "name": "利率政策",
              "impact": -1,
              "intensity": 2,
              "asset_class": "股票",
              "evidence": "美联储释放鹰派信号"
            }}
          ],
          "summary": "短期看空股市"
        }}

        待分析文本：
        {input_text}"""

        # 生成投资建议提示词
        self.advice_prompt = """你是一名专业金融投资顾问，请根据以下信息生成结构化投资建议：

        # 输入数据
        {input_text}

        # 输出要求
        1. 推荐产品：
           - 从市场数据中选择1-3个基于影响因子最匹配用户的产品，
           - 每个产品需包含：代码、名称、推荐理由、建议配置比例(5%-20%)、建议买入数量
        2. 资产配置调整：
           - 根据用户当前持仓和市场情况给出比例建议（如"60%债券+30%股票+10%现金"）
        3. 风险提示：
           - 列出1-2条主要风险

        # 输出格式（严格JSON）
        {{
          "recommendations": [
            {{
              "product_code": str,
              "product_name": str,
              "reason": str,
              "allocation": "X%",
              "suggested_quantity": int
            }}
          ],
          "asset_allocation": str,
          "risk_warnings": [str]
        }}

        # 示例输出
        {{
          "recommendations": [
            {{
              "product_code": "511260",
              "product_name": "10年期国债ETF",
              "reason": "利率上升环境下，短久期国债抗波动性强",
              "allocation": "15%",
              "suggested_quantity": 1000
            }}
          ],
          "asset_allocation": "建议调整为：60%国债+20%高等级信用债+20%货币基金",
          "risk_warnings": [
            "需关注美联储加息节奏",
            "避免配置低流动性债券"
          ]
        }}"""

    def _call_api(self, messages, temperature=0.7, json_mode=False):
        """通用API调用方法"""
        data = {
            "model": "deepseek-chat",
            "messages": messages,
            "temperature": temperature,
            "max_tokens": 2000,
        }
        if json_mode:
            data["response_format"] = {"type": "json_object"}

        try:
            response = requests.post(
                self.api_url,
                json=data,
                headers=self.headers,
                timeout=30
            )
            response.raise_for_status()
            return response.json()
        except requests.exceptions.RequestException as e:
            return {"error": f"API请求失败: {e}"}
        except Exception as e:
            return {"error": f"解析失败: {e}"}

    def financial_factors_mining(self, text):
        """专业金融因子提取"""
        # 使用双花括号转义，然后手动替换input_text
        prompt = self.factor_mine_prompt.replace("{input_text}", text)

        messages = [
            {"role": "system", "content": "你只输出合规的JSON，不包含任何额外解释"},
            {"role": "user", "content": prompt}
        ]

        result = self._call_api(messages, temperature=0.1, json_mode=True)

        # 结果处理
        if "error" in result:
            return result

        try:
            content = result.get("choices", [{}])[0].get("message", {}).get("content", "{}")
            return json.loads(content)
        except json.JSONDecodeError:
            return {"error": "JSON解析失败", "raw_response": content}

    def advice_generator(self, text):

        prompt = self.advice_prompt.replace("{input_text}", text)

        messages = [
            {"role": "system", "content": "你只输出合规的JSON，不包含任何额外解释"},
            {"role": "user", "content": prompt}
        ]

        result = self._call_api(messages, temperature=0.1, json_mode=True)

        # 结果处理
        if "error" in result:
            return result

        try:
            content = result.get("choices", [{}])[0].get("message", {}).get("content", "{}")
            return json.loads(content)
        except json.JSONDecodeError:
            return {"error": "JSON解析失败", "raw_response": content}




def main():
    ai = DeepSeekAI()

    news = """
    美联储维持利率不变，但释放鹰派信号导致美股期货下跌。
    国际原油库存骤降5%，布伦特原油价格应声上涨2%。
    中国对半导体行业出台新的补贴政策。
    """

    # 测试金融因子挖掘
    factors = ai.financial_factors_mining(news)
    print(json.dumps(factors, indent=2, ensure_ascii=False))


if __name__ == "__main__":
    main()